package com.lang;

import org.junit.Assert;
import org.junit.Test;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * Created by yangliwei on 2017/7/24.
 */
public class ClassDemo {

    //目测返回相同的类信息
    @Test
    public void testGetCanonicalName() {
        Class clazz = Object.class;
        Assert.assertEquals("java.lang.Object", clazz.getCanonicalName());
        Assert.assertEquals("java.lang.Object", clazz.getName());
//        com.lang.ClassDemo
        System.out.println(this.getClass().getCanonicalName());
    }

    @Test
    public void testGetResource() {
        Class clazz = ClassDemo.class;
//        file:/D:/ideaproject/javastudy/bin/  这个貌似和idea里面的输出有关系
        System.out.println(clazz.getResource("/"));
    }

    @Test
    public void testGetPackage() {
        Class clazz = ClassDemo.class;
//        package com.lang
        System.out.println(clazz.getPackage());
    }

    //    返回本类直接实现的接口，包括泛型信息
//    出现了一个ClassRepository类还未深入
    @Test
    public void testGetGenericInterface() {
        Class clazz = Integer.class;
        Type[] types = clazz.getGenericInterfaces();

        for (Type t : types) {
            Assert.assertEquals("java.lang.Comparable<java.lang.Integer>", t.toString());
            Assert.assertEquals("java.lang.Comparable<java.lang.Integer>", t.getTypeName());
//            这里出现了t有方法却没法直接调用，所以t肯定是一个子类，所以需要向下转型
            //一般向下转型的时候判断下
            if (t instanceof ParameterizedType) {
                Type[] parameterizeTypes = ((ParameterizedType) t).getActualTypeArguments();
                for (Type parameterizeType : parameterizeTypes) {
                    Assert.assertEquals("java.lang.Integer", parameterizeType.getTypeName());
                }
            }

        }
    }

    @Test
    public void testGetProtectionDomain(){
        System.out.println(ClassDemo.class.getProtectionDomain());
        System.out.println(ClassDemo.class.getProtectionDomain().getCodeSource().getLocation().getFile());

    }

    /**
     * 加载并初始化某个类
     */
    @Test
    public void testForName(){
        try {
            Object o = Class.forName("com.mysql.jdbc.Driver",true,this.getClass().getClassLoader());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    /**
     * 获取数组类对应元素的类型，
     * Integer是一个类，Integer[] 也是一个类
     */
    @Test
    public void testGetComponentType(){
        Integer[] is = new Integer[]{1, 2, 3};
        Class isClass = is.getClass();
        System.out.println("Integer[] 对应的类类型 " + isClass);

        Class<?> componentType = is.getClass().getComponentType();
        System.out.println("Integer[] 中元素对应的类类型 "+componentType);
    }

}
